import time
import logging
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

logger = logging.getLogger(__name__)


class BilibiliSearchPage:
    def __init__(self, driver):
        self.driver = driver
        # 搜索结果列表容器（限定只在这个容器内找视频，避免干扰）
        self.RESULT_CONTAINER = (By.CSS_SELECTOR, ".video-list")
        # 容器内的第一个视频链接
        self.FIRST_VIDEO = (By.CSS_SELECTOR, ".bili-video-card:first-child a[href*='/video/BV']")

    def has_search_results(self):
        """检查搜索结果容器是否存在（确保在搜索结果页）"""
        # 输出当前页面URL
        current_url = self.driver.current_url
        logger.info(f"[当前页面URL] 检查搜索结果容器: {current_url}")

        try:
            WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located(self.RESULT_CONTAINER)
            )
            logger.info("搜索结果页验证成功，存在视频列表容器")
            return True
        except Exception as e:
            logger.error(f"搜索结果页验证失败（当前URL: {current_url}）: {e}")
            return False

    def click_first_video(self):
        """点击第一个视频（增加超时容错和强制跳转）"""
        # 输出当前页面URL（搜索结果页）
        current_search_url = self.driver.current_url
        logger.info(f"[当前页面URL] 准备点击第一个视频: {current_search_url}")
        logger.info("尝试点击搜索结果页的第一个视频")

        try:
            # 1. 定位搜索结果容器
            container = WebDriverWait(self.driver, 15).until(
                EC.presence_of_element_located(self.RESULT_CONTAINER)
            )

            # 2. 定位第一个视频链接
            video_link = WebDriverWait(container, 15).until(
                EC.element_to_be_clickable(self.FIRST_VIDEO)
            )
            video_url = video_link.get_attribute("href")
            logger.info(f"[目标视频URL] 找到第一个视频链接: {video_url}")

            # 3. 强制在当前窗口打开视频（避免新窗口跳转问题）
            self.driver.execute_script("arguments[0].removeAttribute('target');", video_link)
            # 用JS点击（最稳定的方式）
            self.driver.execute_script("arguments[0].click();", video_link)
            logger.info(f"[操作] 已用JS点击视频链接: {video_url}")

            # 4. 等待视频页加载（增加超时时间）
            try:
                WebDriverWait(self.driver, 20).until(
                    EC.url_contains("/video/")
                )
                # 输出跳转后的视频页URL
                video_page_url = self.driver.current_url
                logger.info(f"[跳转后URL] 自动跳转至视频页: {video_page_url}")
            except:
                # 超时后直接强制跳转
                logger.warning(f"[超时处理] 视频页跳转超时，将强制打开链接: {video_url}")
                self.driver.get(video_url)
                time.sleep(3)
                # 输出强制跳转后的URL
                forced_video_url = self.driver.current_url
                logger.info(f"[强制跳转后URL] 已强制打开视频页: {forced_video_url}")

            logger.info(f"成功进入视频页: {self.driver.current_url}")
            return True

        except Exception as e:
            logger.error(f"点击视频失败（当前搜索页URL: {current_search_url}）: {e}")
            return False